home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / misc / rltext.c < prev    next >
C/C++ Source or Header  |  1994-03-20  |  2KB  |  59 lines

  1. /*
  2.  * This is a **very** simple text compression program which performs
  3.  * a "Run Length" encoding of duplicated characters in the input file.
  4.  * It is designed to operate as a "unix" style filter, accepting input
  5.  * from "stdin" and writing to "stdout".
  6.  *
  7.  * Syntax:    RLTEXT (Encode | Decode) <input_file >output_file
  8.  *
  9.  * Whenever two or more identical characters are encountered, the
  10.  * following two character sequence is substituted:
  11.  *        Byte1:    Character with high bit set
  12.  *        Byte2:    Count of additional characters (up to 255)
  13.  *
  14.  * Note that this scheme works only on ASCII text files, and becomes *very*
  15.  * confused if the original file contains characters with the high bit set.
  16.  *
  17.  * Compile command: cc rltext -fop
  18.  */
  19. #include <stdio.h>
  20. #include <file.h>
  21.  
  22. main(argc, argv)
  23.     int argc;
  24.     char *argv[];
  25. {
  26.     int c, d;
  27.     unsigned char n;
  28.  
  29.     /* Use MICRO-C's more powerful '&&' to force a zero if !enough args */
  30.     switch((argc > 1) && toupper(*argv[1])) {
  31.         case 'E' :                /* Encode file */
  32.             *(char*)stdout |= F_BINARY;        /* Convert stdout to BINARY */
  33.             c = getc(stdin);
  34.             while((d = getc(stdin)) != EOF) {
  35.                 if(d == c) {
  36.                     n = 0;
  37.                     while(((d = getc(stdin)) == c) && (n < 255))
  38.                         ++n;
  39.                     putc(c | 0x80, stdout);
  40.                     putc(n, stdout); }
  41.                 else 
  42.                     putc(c, stdout);
  43.                 c = d; }
  44.             putc(c, stdout);
  45.             break;
  46.         case 'D' :                /* Decode file */
  47.             *(char*)stdin |= F_BINARY;        /* Convert stdin to BINARY */
  48.             while((c = getc(stdin)) != EOF)
  49.                 if(c & 0x80) {
  50.                     n = getc(stdin);
  51.                     for(d = (unsigned)n + 2; d; --d)
  52.                         putc(c & 0x7f, stdout); }
  53.                 else
  54.                     putc(c, stdout);
  55.             break;
  56.         default:
  57.             abort("Use: RLTEXT E|D <input_file >output_file"); }
  58. }
  59.